package com.able.concurrency.t4;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * @author abel.he
 * @data 2018/10/25 16:31
 * @describe
 * SynchronusQueue 是一个容量为 0 的队列。 是一个特殊的 TransferQueue
 * 必须现有消费线程等待，才能使用的队列。
 * add 方法，无阻塞。若没有消费线程阻塞等待数据，则抛出异常。
 * put 方法，有阻塞。若没有消费线程阻塞等待数据，则阻塞。
 */
public class Test8_SynchronusQueue {

    BlockingQueue blockingQueue = new SynchronousQueue();

    public static void main(String[] args) {
        final Test8_SynchronusQueue queue = new Test8_SynchronusQueue();
/*
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
//                    System.out.println(Thread.currentThread().getName() + "begin");
//                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName() + queue.blockingQueue.take());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "output thread ").start();

//        queue.blockingQueue.add("hello Synchronus");
        try {
            queue.blockingQueue.put("hello Synchronus");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/

        try {
            queue.blockingQueue.put("test put");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName() + " queue size : " + queue.blockingQueue.size());

    }

}
